home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Environments / Clean 1.2.4 / MacInterface / quickdraw.icl < prev    next >
Encoding:
Modula Implementation  |  1996-12-06  |  16.9 KB  |  647 lines  |  [TEXT/3PRM]

  1. implementation module quickdraw;
  2.  
  3. import StdInt;
  4. import mac_types;
  5.  
  6. BlackColor:==33;
  7. WhiteColor:==30;
  8. RedColor:==205;
  9. GreenColor:==341;
  10. BlueColor:==409;
  11. CyanColor:==273;
  12. MagentaColor:== 137;
  13. YellowColor:== 69;
  14.  
  15. PatCopy :== 8;
  16. PatOr :== 9;
  17. PatXor :== 10;
  18. PatBic :== 11;
  19. NotPatCopy :== 12;
  20. NotPatOr :== 13;
  21. NotPatXor :== 14;
  22. NotPatBic :== 15;
  23. PatHilite :== 50;
  24.  
  25. White :== (0,0);
  26. Black :== (-1,-1);
  27. Gray :== (1437226410,1437226410);
  28. LtGray :== (-2011002846,-2011002846);
  29. DkGray :== (2011002845,2011002845);
  30.  
  31. Bold :== 1;
  32. Italic :== 2;
  33. Underline :== 4;
  34. Outline :== 8;
  35. Shadow :== 16;
  36. Condense :== 32;
  37. Extend :== 64;
  38.  
  39. SrcCopy :== 0;
  40. SrcOr :== 1;
  41. SrcXor :== 2;
  42. SrcBic :== 3;
  43.  
  44. ScrnHResAddress :== 260;
  45. ScrnVResAddress :== 258;
  46.  
  47. ::    GrafPtr :== Int;
  48. ::    PicHandle :== Int;
  49. ::    PolyHandle :== Int;
  50. ::    RGBColor :== (!Int,!Int,!Int);
  51.  
  52. //    GrafPort Routines
  53.  
  54. QSetPort :: !GrafPtr !Toolbox -> Toolbox;
  55. QSetPort port t = code (port=L,t=U)(z=Z){
  56.     instruction 0xA873
  57. };
  58.  
  59. QGetPort :: !Toolbox -> (!GrafPtr,!Toolbox);
  60. QGetPort t = code (t=R4O0U)(current_port=L,z=Z){
  61.     instruction 0xA874
  62. };
  63.  
  64. QSetOrigin :: !Int !Int !Toolbox -> Toolbox;
  65. QSetOrigin h v t = code (h=W,v=W,t=U)(z=Z){
  66.     instruction 0xA878
  67. };
  68.  
  69. QSetClip :: !RgnHandle !Toolbox -> Toolbox;
  70. QSetClip rgn t = code (rgn=L,t=U)(z=Z){
  71.     instruction 0xA879
  72. };
  73.  
  74. QGetClip :: !RgnHandle !Toolbox -> (!RgnHandle,!Toolbox);
  75. QGetClip rgn t = code (rgn=L,t=U)(rgn`=D1,z=Z){
  76.     instruction 0x2A01            ||    move.l    d1,d5
  77.     instruction 0xA87A
  78.     instruction 0x2205            ||    move.l    d5,d1
  79. };
  80.  
  81. QClipRect :: !Rect !Toolbox -> Toolbox;
  82. QClipRect (left,top,right,bottom) t =
  83. code (right=W,bottom=W,left=W,top=W,t=O0U)(z=I8Z){
  84.     instruction 0xA87B
  85. };
  86.  
  87. //    Cursor-Handling Routines
  88.  
  89. QInitCursor :: !Toolbox -> Toolbox;
  90. QInitCursor t = code (t=U)(z=Z){
  91.     instruction 0xA850
  92. };
  93.  
  94. QSetCursor :: !Ptr !Toolbox -> Toolbox;
  95. QSetCursor crsr t = code (crsr=L,t=U)(z=Z){
  96.     instruction 0xA851
  97. };
  98.  
  99. QHideCursor :: !Toolbox -> Toolbox;
  100. QHideCursor t = code (t=U)(z=Z){
  101.     instruction 0xA852
  102. };
  103.  
  104. QShowCursor :: !Toolbox -> Toolbox;
  105. QShowCursor t = code (t=U)(z=Z){
  106.     instruction 0xA853
  107. };
  108.  
  109. QObscureCursor :: !Toolbox -> Toolbox;
  110. QObscureCursor t = code (t=U)(z=Z){
  111.     instruction 0xA856
  112. };
  113.  
  114. //    Pen and Line-Drawing Routines
  115.  
  116. QHidePen :: !Toolbox -> Toolbox;
  117. QHidePen t = code (t=U)(z=Z){
  118.     instruction 0xA896
  119. };
  120.  
  121. QShowPen :: !Toolbox -> Toolbox;
  122. QShowPen t = code (t=U)(z=Z){
  123.     instruction 0xA897
  124. };
  125.  
  126. QGetPen :: !Toolbox -> (!Int,!Int,!Toolbox);
  127. QGetPen t = (h,v,t1);
  128.     where {
  129.         (v,h,t1) = QGetPen` t;
  130.     };
  131.  
  132. QGetPen` :: !Toolbox -> (!Int,!Int,!Toolbox);
  133. QGetPen` t = code (t=R4O0U)(v=W,h=W,d=Z){
  134.     instruction 0xA89A    ||    _GetPen
  135. };
  136.  
  137. QPenSize :: !Int !Int !Toolbox -> Toolbox;
  138. QPenSize width height t = code (width=W,height=W,t=U)(z=Z){
  139.     instruction 0xA89B
  140. };
  141.  
  142. QPenMode :: !Int !Toolbox -> Toolbox;
  143. QPenMode mode t = code (mode=W,t=U)(z=Z){
  144.     instruction 0xA89C
  145. };
  146.  
  147. QPenPat :: !(!Int,!Int) !Toolbox -> Toolbox;
  148. QPenPat (pat1,pat2) t = code (pat2=L,pat1=L,t=O0U)(z=I8Z){ 
  149.     instruction 0xA89D
  150. };
  151.  
  152. QPenNormal :: !Toolbox -> Toolbox;
  153. QPenNormal t = code (t=U)(z=Z){
  154.     instruction 0xA89E
  155. };
  156.  
  157. QMoveTo :: !Int !Int !Toolbox -> Toolbox;
  158. QMoveTo h v t = code (h=W,v=W,t=U)(z=Z){
  159.     instruction 0xA893
  160. };
  161.  
  162. QMove :: !Int !Int !Toolbox -> Toolbox;
  163. QMove dh dv t = code (dh=W,dv=W,t=U)(z=Z){
  164.     instruction 0xA894
  165. };
  166.  
  167. QLineTo :: !Int !Int !Toolbox -> Toolbox;
  168. QLineTo h v t = code (h=W,v=W,t=U)(z=Z){
  169.     instruction 0xA891
  170. };
  171.  
  172. QLine :: !Int !Int !Toolbox -> Toolbox;
  173. QLine dh dv t = code (dh=W,dv=W,t=U)(z=Z){
  174.     instruction 0xA892
  175. };
  176.  
  177. //    Text-Drawing Routines
  178.  
  179. QTextFont :: !Int !Toolbox -> Toolbox;
  180. QTextFont font t = code (font=W,t=U)(z=Z){
  181.     instruction 0xA887
  182. };
  183.  
  184. QTextFace :: !Int !Toolbox -> Toolbox;
  185. QTextFace face t = code (face=W,t=U)(z=Z){
  186.     instruction 0xA888
  187. };
  188.  
  189. QTextMode :: !Int !Toolbox -> Toolbox;
  190. QTextMode mode t = code (mode=W,t=U)(z=Z){
  191.     instruction    0xA889
  192. };
  193.  
  194. QTextSize :: !Int !Toolbox -> Toolbox;
  195. QTextSize size t = code (size=W,t=U)(z=Z){
  196.     instruction 0xA88A
  197. };
  198.  
  199. QDrawChar :: !Char !Toolbox -> Toolbox;
  200. QDrawChar char t = code (char=W,t=U)(z=Z){
  201.     instruction 0xA883
  202. };
  203.  
  204. QDrawString :: !{#Char} !Toolbox -> Toolbox;
  205. QDrawString s t = code (s=A0,t=U)(z=Z){
  206.     instruction 0x4868 0x0008    |    pea        8(a0)
  207.     instruction 0x4267            |    clr        -(sp)
  208.     instruction 0x3F28 0x0006    |    move    6(a0),-(sp)
  209.     instruction 0xA885            |    _DrawText
  210. };
  211.  
  212. QCharWidth :: !Char !Toolbox -> (!Int,!Toolbox);
  213. QCharWidth char t = code (char=R2W,t=U)(width=W,z=Z){
  214.     instruction 0xA88D    |    _CharWidth
  215. };
  216.  
  217. QStringWidth :: !{#Char} !Toolbox -> (!Int,!Toolbox);
  218. QStringWidth s t = code (s=R2A0,t=U)(width=W,z=Z){
  219.     instruction 0x4868 0x0008    |    pea        8(a0)
  220.     instruction 0x4267            |    clr        -(sp)
  221.     instruction 0x3F28 0x0006    |    move    6(a0),-(sp)
  222.     instruction 0xA886            |    _TextWidth
  223. };
  224.  
  225. QGetFontInfo :: !Toolbox -> (!Int,!Int,!Int,!Int,!Toolbox);
  226. QGetFontInfo t = code (t=R8O0U)(ascent=W,descent=W,widMax=W,leading=W,z=Z){
  227.     instruction 0xA88B
  228. };
  229.  
  230. //    Drawing in Color
  231.  
  232. QForeColor :: !Int !Toolbox -> Toolbox;
  233. QForeColor color t = code (color=L,t=U)(z=Z){
  234.     instruction 0xA862
  235. };
  236.  
  237. QRGBBackColor :: !RGBColor !Toolbox -> Toolbox;
  238. QRGBBackColor (red,green,blue) t
  239. = code (blue=W,green=W,red=W,t=O0U)(z=I6Z){
  240.     instruction 0xAA15
  241. };
  242.  
  243. QRGBForeColor :: !RGBColor !Toolbox -> Toolbox;
  244. QRGBForeColor (red,green,blue) t
  245. = code (blue=W,green=W,red=W,t=O0U)(z=I6Z){
  246.     instruction 0xAA14
  247. };
  248.  
  249. QSetCPixel :: !Int !Int !RGBColor !Toolbox -> Toolbox;
  250. QSetCPixel h v (red,green,blue) t
  251. = code (blue=W,green=W,red=W,h=W,v=W,t=O4U)(z=I6Z){
  252.     instruction 0xAA16
  253. };
  254.  
  255. QBackColor :: !Int !Toolbox -> Toolbox;
  256. QBackColor color t = code (color=L,t=U)(z=Z){
  257.     instruction 0xA863
  258. };
  259.  
  260. //    Calculations with Rectangles
  261.  
  262. //    Graphic Operations on Rectangles
  263.  
  264. QFrameRect :: !Rect !Toolbox -> Toolbox;
  265. QFrameRect (left,top,right,bottom) t =
  266. code (right=W,bottom=W,left=W,top=W,t=O0U)(z=I8Z){
  267.     instruction 0xA8A1
  268. };
  269.  
  270. QPaintRect :: !Rect !Toolbox -> Toolbox;
  271. QPaintRect (left,top,right,bottom) t =
  272. code (right=W,bottom=W,left=W,top=W,t=O0U)(z=I8Z){
  273.     instruction 0xA8A2
  274. };
  275.  
  276. QEraseRect :: !Rect !Toolbox -> Toolbox;
  277. QEraseRect (left,top,right,bottom) t =
  278. code (right=W,bottom=W,left=W,top=W,t=O0U)(z=I8Z){
  279.     instruction 0xA8A3
  280. };
  281.  
  282. QInvertRect :: !Rect !Toolbox -> Toolbox;
  283. QInvertRect (left,top,right,bottom) t =
  284. code (right=W,bottom=W,left=W,top=W,t=O0U)(z=I8Z){
  285.     instruction 0xA8A4
  286. };
  287.  
  288. //    Graphic operations on Ovals
  289.  
  290. QFrameOval :: !Rect !Toolbox -> Toolbox;
  291. QFrameOval (left,top,right,bottom) t =
  292. code (right=W, bottom=W,left=W,top=W,t=O0U)(z=I8Z){
  293.     instruction 0xA8B7
  294. };
  295.  
  296. QPaintOval :: !Rect !Toolbox -> Toolbox;
  297. QPaintOval (left,top,right,bottom) t =
  298. code (right=W,bottom=W,left=W,top=W,t=O0U)(z=I8Z){
  299.     instruction 0xA8B8
  300. };
  301.  
  302. QEraseOval :: !Rect !Toolbox -> Toolbox;
  303. QEraseOval (left,top,right,bottom) t =
  304. code (right=W,bottom=W,left=W,top=W,t=O0U)(z=I8Z){
  305.     instruction 0xA8B9
  306. };
  307.  
  308. QInvertOval :: !Rect !Toolbox -> Toolbox;
  309. QInvertOval (left,top,right,bottom) t =
  310. code (right=W,bottom=W,left=W,top=W,t=O0U)(z=I8Z){
  311.     instruction 0xA8BA
  312. };
  313.  
  314. //    Graphic Operations on Rounded-Corner Rectangles
  315.  
  316. QFrameRoundRect :: !Rect !Int !Int !Toolbox -> Toolbox;
  317. QFrameRoundRect (left,top,right,bottom) ovalWidth ovalHeight t =
  318. code (right=W,bottom=W,left=W,top=W,ovalWidth=O0W,ovalHeight=W,t=U)(z=I8Z){
  319.     instruction 0xA8B0
  320. };
  321.  
  322. QPaintRoundRect :: !Rect !Int !Int !Toolbox -> Toolbox;
  323. QPaintRoundRect (left,top,right,bottom) ovalWidth ovalHeight t =
  324. code (right=W,bottom=W,left=W,top=W,ovalWidth=O0W,ovalHeight=W,t=U)(z=I8Z){
  325.     instruction 0xA8B1
  326. };
  327.  
  328. QEraseRoundRect :: !Rect !Int !Int !Toolbox -> Toolbox;
  329. QEraseRoundRect (left,top,right,bottom) ovalWidth ovalHeight t =
  330. code (right=W,bottom=W,left=W,top=W,ovalWidth=O0W,ovalHeight=W,t=U)(z=I8Z){
  331.     instruction 0xA8B2
  332. };
  333.  
  334. QInvertRoundRect :: !Rect !Int !Int !Toolbox -> Toolbox;
  335. QInvertRoundRect (left,top,right,bottom) ovalWidth ovalHeight t =
  336. code (right=W,bottom=W,left=W,top=W,ovalWidth=O0W,ovalHeight=W,t=U)(z=I8Z){
  337.     instruction 0xA8B3
  338. };
  339.  
  340. //    Graphic Operations on Arcs and Wedges
  341.  
  342. QFrameArc :: !Rect !Int !Int !Toolbox -> Toolbox;
  343. QFrameArc (left,top,right,bottom) startAngle arcAngle t =
  344. code (right=W,bottom=W,left=W,top=W,startAngle=O0W,arcAngle=W,t=U)(z=I8Z){
  345.     instruction 0xA8BE
  346. };
  347.  
  348. QPaintArc :: !Rect !Int !Int !Toolbox -> Toolbox;
  349. QPaintArc (left,top,right,bottom) startAngle arcAngle t =
  350. code (right=W,bottom=W,left=W,top=W,startAngle=O0W,arcAngle=W,t=U)(z=I8Z){
  351.     instruction 0xA8BF
  352. };
  353.  
  354. QEraseArc :: !Rect !Int !Int !Toolbox -> Toolbox;
  355. QEraseArc (left,top,right,bottom) startAngle arcAngle t =
  356. code (right=W,bottom=W,left=W,top=W,startAngle=O0W,arcAngle=W,t=U)(z=I8Z){
  357.     instruction 0xA8C0
  358. };
  359.  
  360. QInvertArc :: !Rect !Int !Int !Toolbox -> Toolbox;
  361. QInvertArc (left,top,right,bottom) startAngle arcAngle t =
  362. code (right=W,bottom=W,left=W,top=W,startAngle=O0W,arcAngle=W,t=U)(z=I8Z){
  363.     instruction 0xA8C1
  364. };
  365.  
  366. //    Calculations with Regions
  367.  
  368. QNewRgn :: !Toolbox -> (!RgnHandle, !Toolbox);
  369. QNewRgn t = code (t=R4U)(region=L,z=Z){
  370.     instruction 0xA8D8    ||    _NewRgn
  371. };
  372.  
  373. QOpenRgn :: !RgnHandle !Toolbox -> Toolbox;
  374. QOpenRgn region t = code (region=U,t=U)(z=Z){
  375.     instruction 0xA8DA    ||    _OpenRgn
  376. };
  377.  
  378. QCloseRgn :: !RgnHandle !Toolbox -> Toolbox;
  379. QCloseRgn region t = code (region=L,t=U)(z=Z){
  380.     instruction 0xA8DB
  381. };
  382.  
  383. QDisposeRgn :: !RgnHandle !Toolbox -> Toolbox;
  384. QDisposeRgn region t = code (region=L,t=u)(z=Z){
  385.     instruction 0xA8D9
  386. };
  387.  
  388. QOffsetRgn :: !RgnHandle !Int !Int !Toolbox -> Toolbox;
  389. QOffsetRgn region dh dv t = code (region=L,dh=W,dv=W,t=U)(z=Z){
  390.     instruction 0xA8E0
  391. };
  392.  
  393. QRectRgn :: !RgnHandle !Rect !Toolbox -> Toolbox;
  394. QRectRgn rgn (left,top,right,bottom) t =
  395. code (right=W, bottom=W, left=W, top=W,rgn=L,t=O4U)(z=I8Z){
  396.     instruction 0xA8DF
  397. };
  398.  
  399. QSectRgn :: !RgnHandle !RgnHandle !RgnHandle !Toolbox -> (!RgnHandle, !Toolbox);
  400. QSectRgn srcRgnA srcRgnB dstRgn t =
  401. code (srcRgnA=L,srcRgnB=L,dstRgn=D1,t=U)(srcRgn`=D1,z=Z){
  402.     instruction 0x2A01            ||    move.l    d1,d5
  403.     instruction 0x2F01            ||    move.l    d1,-(sp)
  404.     instruction 0xA8E4
  405.     instruction 0x2205            ||    move.l    d5,d1
  406. };
  407.  
  408. QUnionRgn :: !RgnHandle !RgnHandle !RgnHandle !Toolbox -> (!RgnHandle, !Toolbox);
  409. QUnionRgn srcRgnA srcRgnB dstRgn t =
  410. code (srcRgnA=L,srcRgnB=L,dstRgn=D1,t=U)(srcRgn`=D1,z=Z){
  411.     instruction 0x2A01            ||    move.l    d1,d5
  412.     instruction 0x2F01            ||    move.l    d1,-(sp)
  413.     instruction 0xA8E5
  414.     instruction 0x2205            ||    move.l    d5,d1
  415. };
  416.  
  417. QDiffRgn :: !RgnHandle !RgnHandle !RgnHandle !Toolbox -> (!RgnHandle, !Toolbox);
  418. QDiffRgn srcRgnA srcRgnB dstRgn t =
  419. code (srcRgnA=L,srcRgnB=L,dstRgn=D1,t=U)(srcRgn`=D1,z=Z){
  420.     instruction 0x2A01            ||    move.l    d1,d5
  421.     instruction 0x2F01            ||    move.l    d1,-(sp)
  422.     instruction 0xA8E6
  423.     instruction 0x2205            ||    move.l    d5,d1
  424. };
  425.  
  426. QPtInRgn :: !(!Int,!Int) !RgnHandle !Toolbox -> (!Bool,!Toolbox);
  427. QPtInRgn (x,y) rgn t = code (x=R2W,y=W,rgn=L,t=U)(b=D1,z=Z){
  428.     instruction 0xA8E8
  429.     instruction 0x7000            ||    moveq    #0,d0
  430.     instruction 0x101F            ||    move.b    (sp)+,d0
  431.     instruction 0x4440            ||    neg.w    d0
  432.     instruction 0x48C0            ||    ext.l    d0
  433.     instruction 0x2200            ||    move.l    d0,d1
  434. };
  435.  
  436. QEmptyRgn :: !RgnHandle !Toolbox -> (!Bool, !Toolbox);
  437. QEmptyRgn region t = code (region=R2L,t=U)(empty_region=D1,z=Z){
  438.     instruction 0xA8E2
  439.     instruction 0x7000            ||    moveq    #0,d0
  440.     instruction 0x101F            ||    move.b    (sp)+,d0
  441.     instruction 0x4440            ||    neg.w    d0
  442.     instruction 0x48C0            ||    ext.l    d0
  443.     instruction 0x2200            ||    move.l    d0,d1
  444. };
  445.  
  446. //    Graphic Operations on Regions
  447.  
  448. QFrameRgn :: !RgnHandle !Toolbox -> Toolbox;
  449. QFrameRgn region t = code (region=L,t=U)(z=Z){
  450.     instruction 0xA8D2
  451. };
  452.  
  453. QPaintRgn :: !RgnHandle !Toolbox -> Toolbox;
  454. QPaintRgn region t = code (region=L,t=U)(z=Z){
  455.     instruction 0xA8D3
  456. };
  457.  
  458. QEraseRgn :: !RgnHandle !Toolbox -> Toolbox;
  459. QEraseRgn region t = code (region=L,t=U)(z=Z){
  460.     instruction 0xA8D4
  461. };
  462.  
  463. QInvertRgn :: !RgnHandle !Toolbox -> Toolbox;
  464. QInvertRgn region t = code (region=L,t=U)(z=Z){
  465.     instruction 0xA8D5
  466. };
  467.  
  468. //    Bit Transfer Operations
  469.  
  470. QScrollRect :: !Rect !Int !Int !RgnHandle !Toolbox -> Toolbox;
  471. QScrollRect (left,top,right,bottom) dh dv updateRgn t =
  472. code (right=W,bottom=W,left=W,top=W,dh=O0W,dv=W,updateRgn=L,t=U)(z=I8Z){
  473.     instruction 0xA8EF            ||    _ScrollRect
  474. };
  475.  
  476. CopyBits :: !Ptr !Int !Rect !Ptr !Int !Rect !Rect !Rect !Int !RgnHandle !Toolbox -> Toolbox;
  477. CopyBits
  478.     srcBaseAddr srcRowBytes (srcBoundsLeft,srcBoundsTop,srcBoundsRight,srcBoundsBottom)
  479.     destBaseAddr destRowBytes (destBoundsLeft,destBoundsTop,destBoundsRight,destBoundsBottom)
  480.     (srcLeft,srcTop,srcRight,srcBottom) (destLeft,destTop,destRight,destBottom)
  481.     mode maskRgn t =
  482. code (
  483.     srcBoundsRight=W, srcBoundsBottom=W, srcBoundsLeft=W, srcBoundsTop=W, srcRowBytes=W, srcBaseAddr=L,
  484.     destBoundsRight=W, destBoundsBottom=W, destBoundsLeft=W, destBoundsTop=W, destRowBytes=W, destBaseAddr=L,
  485.     srcRight=W, srcBottom=W, srcLeft=W, srcTop=W,
  486.     destRight=W, destBottom=W, destLeft=W, destTop=W,
  487.     mode=U, maskRgn=U, t=U)(z=Z)
  488. {
  489.     instruction 0x486F 0x001E    ||    pea 8+8+14(sp)
  490.     instruction 0x486F 0x0014    ||    pea 8+8+4(sp)
  491.     instruction 0x486F 0x0010    ||    pea 8+8(sp)
  492.     instruction 0x486F 0x000C    ||    pea 12(sp)
  493.     instruction 0x3F2F 0x0072    ||    move.w 44+80-28+16+2(sp),-(sp)
  494.     instruction 0x2F2F 0x0076    ||    move.l 44+84-28+18(sp),-(sp)
  495.     instruction 0xa8ec
  496.     instruction 0x4FEF 0x002C    ||    lea        8+8+14+14(sp),sp
  497. };
  498.  
  499. //    Pictures
  500.  
  501. QOpenPicture :: !Rect !Toolbox -> (!PicHandle, !Toolbox);
  502. QOpenPicture (left,top,right,bottom) t =
  503. code (right=W,bottom=W,left=W,top=W,t=R4O4D0)(pic_handle=L,z=I8Z){
  504.     instruction 0xA8F3
  505. };
  506.  
  507. QClosePicture :: !PicHandle !Toolbox -> Toolbox;
  508. QClosePicture picture t = code (picture=D1,t=U)(z=Z){
  509.     instruction 0xA8F4    ||    _ClosePicture
  510. };
  511.  
  512. QDrawPicture :: !PicHandle !Rect !Toolbox -> Toolbox;
  513. QDrawPicture picture (left,top,right,bottom) c =
  514. code (right=W,bottom=W,left=W,top=W,picture=L,c=O4U)(z=I8Z){
  515.     instruction 0xA8F6
  516. };
  517.  
  518. QKillPicture :: !PicHandle !Toolbox -> Toolbox;
  519. QKillPicture picture t = code (picture=L,t=U)(z=Z){
  520.     instruction 0xA8F5
  521. };
  522.  
  523. //    Calculations with Polygons
  524.  
  525. QOpenPoly :: !Toolbox -> (!PolyHandle, !Toolbox);
  526. QOpenPoly t = code (t=R4U)(poly=L,z=Z){
  527.     instruction 0xA8CB    ||    _OpenPoly
  528. };
  529.  
  530. QClosePoly :: !PolyHandle !Toolbox -> Toolbox;
  531. QClosePoly poly t = code (poly=U,t=U)(z=Z){
  532.     instruction 0xA8CC    ||    _ClosePgon
  533. };
  534.  
  535. QKillPoly :: !PolyHandle !Toolbox -> Toolbox;
  536. QKillPoly poly t = code (poly=L,t=U)(z=Z){
  537.     instruction 0xA8CD
  538. };
  539.  
  540. QOffsetPoly :: !PolyHandle !Int !Int !Toolbox -> Toolbox;
  541. QOffsetPoly poly dh dv t = code (poly=L,dh=W,dv=W,t=U)(z=Z){
  542.     instruction 0xA8CE
  543. };
  544.  
  545. //    Graphic Operations on Polygons
  546.  
  547. QFramePoly :: !PolyHandle !Toolbox -> Toolbox;
  548. QFramePoly poly t = code (poly=L,t=U)(z=Z){
  549.     instruction 0xA8C6
  550. };
  551.  
  552. QPaintPoly :: !PolyHandle !Toolbox -> Toolbox;
  553. QPaintPoly poly t = code (poly=L,t=U)(z=Z){
  554.     instruction 0xA8C7
  555. };
  556.  
  557. QErasePoly :: !PolyHandle !Toolbox -> Toolbox;
  558. QErasePoly poly t = code (poly=L,t=U)(z=Z){
  559.     instruction 0xA8C8
  560. };
  561.  
  562. QInvertPoly :: !PolyHandle !Toolbox -> Toolbox;
  563. QInvertPoly poly t = code (poly=L,t=U)(z=Z){
  564.     instruction 0xA8C9
  565. };
  566.  
  567. //    Calculations with Points
  568.  
  569. //    Miscellaneous Routines
  570.  
  571. QLocalToGlobal :: !Int !Int !Toolbox -> (!Int,!Int,!Toolbox);
  572. QLocalToGlobal h v t = (nh,nv,z);
  573. {
  574.     (nv,nh,z)= QLocalToGlobal h v t;
  575.  
  576.     QLocalToGlobal :: !Int !Int !Toolbox -> (!Int,!Int,!Toolbox);
  577.     QLocalToGlobal h v t = code (h=W,v=W,t=O0U)(nvr=W,nhr=W,zr=Z){
  578.         instruction 0xA870
  579.     };
  580. }
  581.  
  582. QGlobalToLocal :: !Int !Int !Toolbox -> (!Int,!Int,!Toolbox);
  583. QGlobalToLocal h v t = (nh,nv,z);
  584. {
  585.     (nv,nh,z)= QGlobalToLocal h v t;
  586.     
  587.     QGlobalToLocal :: !Int !Int !Toolbox -> (!Int,!Int,!Toolbox);
  588.     QGlobalToLocal h v t = code (h=W,v=W,t=O0U)(nvr=W,nhr=W,zr=Z){
  589.         instruction 0xA871
  590.     };
  591. }
  592.  
  593. QScreenRect :: !Toolbox -> (!Int,!Int,!Int,!Int,!Toolbox);
  594. QScreenRect tb = (left, top, right, bottom, tb);
  595.     {
  596.         (left, top, right, bottom)=: QScreenRect1;
  597.     };
  598.  
  599. QScreenRect1 :: (!Int,!Int,!Int,!Int);
  600. QScreenRect1 = code ()(left=D3,top=D2,right=D1,bottom=D0){
  601.     instruction 0x2055                    ||    move.l    (a5),a0
  602.     instruction    0x4CA8 0x000F 0xFF8C    ||    movem.w    -116(a0),d0-d3
  603.     instruction    0xC142                    ||    exg        d0,d2
  604.     instruction    0xC343                    ||    exg        d1,d3
  605. };
  606.  
  607. HasColorQD :: !Toolbox -> (!Bool,!Toolbox);
  608. HasColorQD tb = (HasColorQD1, tb);
  609.  
  610. HasColorQD1 :: Bool;
  611. HasColorQD1 = code {
  612. .d 0 0
  613.     jsr    _has_color_qd
  614. .o 0 1 b
  615. };
  616.  
  617. //    Customizing Quickdraw Operations
  618.  
  619. QStdTxMeas :: !Int !{#Char} !(!Int,!Int) !(!Int,!Int) !(!Int,!Int,!Int,!Int) !Toolbox
  620.     -> (!Int,!(!Int,!Int),!(!Int,!Int),!(!Int,!Int,!Int,!Int),!Toolbox);
  621. QStdTxMeas byteCount s (srcnumerh,srcnumerv) (srcdenomh,srcdenomv) (srcascent,srcdescent,srcwidMax,srcleading) tb
  622. = (width,(destnumerh,destnumerv),(destdenomh,destdenomv),(destascent,destdescent,destwidMax,destleading),tb1)
  623. where {
  624.     (width,numer,denom,descasc,leadwid,tb1)
  625.         = QStdTxMeas` byteCount s srcnumerv srcnumerh srcdenomv srcdenomh srcascent srcdescent srcwidMax srcleading tb;
  626.     (destnumerh,destnumerv)    = longTo2Word numer;
  627.     (destdenomh,destdenomv)    = longTo2Word denom;
  628.     (destdescent,destascent)= longTo2Word descasc;
  629.     (destleading,destwidMax)= longTo2Word leadwid;
  630. };
  631.  
  632. QStdTxMeas` :: !Int !{#Char} !Int !Int !Int !Int !Int !Int !Int !Int !Toolbox
  633.     -> (!Int,!Int,!Int,!Int,!Int,!Toolbox);
  634. QStdTxMeas` byteCount s srcnumerv srcnumerh srcdenomv srcdenomh srcascent srcdescent srcwidMax srcleading tb
  635. = code    (srcleading=W,srcwidMax=W,srcdescent=W,srcascent=W,srcdenomh=W,srcdenomv=W,srcnumerh=W,srcnumerv=W,byteCount=R2W,s=S,tb=O8O16O24U)
  636.         (width=W,numer=L,denom=L,ascdesc=L,widlead=L,z=Z){
  637.     instruction 0x52AF 0x000C    |    addq.l #1,12(sp)
  638.     instruction 0xA8ED            |    _StdTxMeas
  639. };
  640.  
  641. longTo2Word :: !Int -> (!Int,!Int);
  642. longTo2Word long = (word1,word2);
  643. where {
  644.     word1    = (long<<16)>>16;
  645.     word2    = long>>16;
  646. };
  647.